package scrape

import (
	"encoding/csv"
	"fmt"
	"log"
	"net/url"
	"nike-scraper/excel_writer"
	"nike-scraper/request"
	"nike-scraper/util"
	"strconv"
	"strings"
	"time"

	"github.com/PuerkitoBio/goquery"
)

// 课程编号计数器
var courseNumber = 1
var platform = "ICourse"

func GetICoursePage(requestURL string, keyWord string) {

	// 创建Excel
	file, writer := excel_writer.CreateExcelFile("resource_example/final", "scrap_file.csv")
	defer writer.Flush()
	defer file.Close()

	for page := 1; page < 3; page++ {
		getListByPage(requestURL, keyWord, page, writer)
		// 在每次请求之间增加延迟
		time.Sleep(2 * time.Second) // 延迟2秒
	}

}

func getListByPage(requestURL string, keyWord string, page int, writer *csv.Writer) {

	// 发送POST请求
	resp := request.SendPostRequest(
		&url.Values{
			"kw":      {keyWord},
			"curPage": {strconv.Itoa(page)},
		}, requestURL)
	defer resp.Body.Close()

	// 解析响应内容
	doc, err := goquery.NewDocumentFromReader(resp.Body)
	if err != nil {
		log.Fatalf("Error parsing response body: %v", err)
	}

	// 将解析后的HTML文档保存到文件
	err = util.SaveHTMLToFile(doc, "resource_example/"+platform, "item_list_"+strconv.Itoa(page)+".html")
	if err != nil {
		log.Fatalf("Error saving HTML to file: %v", err)
	}

	// 提取课程信息
	doc.Find(".icourse-item-modulebox").Each(func(i int, s *goquery.Selection) {
		// 获取课程名称
		courseName := s.Find(".icourse-desc-title").Text()

		// 获取课程链接
		courseLink, _ := s.Find(".icourse-desc-title").Attr("href")
		// 判断是否需要添加协议头部
		fullCourseLink := courseLink
		if !strings.HasPrefix(courseLink, "http://") && !strings.HasPrefix(courseLink, "https://") {
			fullCourseLink = "https:" + courseLink
		}

		// 获取学校信息
		schoolFullText := s.Find(".icourse-desc-school").Text()
		school := cleanSchoolName(schoolFullText)

		// 打印课程信息
		fmt.Printf("课程名称: %s\n课程链接: %s\n学校: %s\n\n", courseName, fullCourseLink, school)

		// 获得课程详情页内容-教师信息
		teachers := queryPage(fullCourseLink, courseName)

		// 构建CSV行 写入CSV文件
		record := []string{fmt.Sprintf("%d", courseNumber), courseName, fullCourseLink, school}
		record = append(record, teachers...)
		if err := writer.Write(record); err != nil {
			log.Fatalf("无法写入CSV文件: %v", err)
		}

		courseNumber++
	})

	// 确保所有数据都被写入文件
	writer.Flush()

	if err := writer.Error(); err != nil {
		log.Fatalf("CSV写入错误: %v", err)
	}
}

// 清理学校名称前缀
func cleanSchoolName(fullText string) string {
	// 假设“ | ”是学校名称前的分隔符，可以通过它进行分割
	parts := strings.Split(fullText, " | ")
	if len(parts) > 1 {
		return parts[1] // 返回分隔符后的部分
	}
	return fullText // 如果没有分隔符，返回原始文本
}
